#ifndef RECT_H
#define RECT_H

#include "displayable.h"

/*!
 * 	\class :  Rect
 *      \brief :  Classe dérivé de Displayable représentant un rectangle dans la scène OpenGL
 */

class Rect : public Displayable
{
    public :

    /*****************************************************************/
    /*                  Propriétés                                   */
    /*****************************************************************/

    float width;	/*!< Longueur du rectangle   */
    float height;	/*!< Largeur du rectangle    */

    Vectorf normal;     /*!< Direction du vecteur normal utilisé pour déterminer le plan du rectangle */

    Vectorf color;      /*!< Composantes RGB ou RGBA de la couleur du rectangle en float (entre 0.0 et 1.0) */

    /*****************************************************************/
    /*                  Constructeur                                 */
    /*****************************************************************/

    /*!
     *	\fn Rect()
     * 	\brief	Construit un carré de taille 1 sur la matrice identité
     */

    Rect();

    /*!
     * 	\fn Rect(float size)
     * 	\brief Construit un carré en 0
     *
     * 	\param size : coté du carré
     */

    Rect(float size);

    /*!
     * 	\fn Rect(float size, Vector3f position)
     * 	\brief Construit un carré et le translate sur la scene
     *
     * 	\param size : coté du carré
     * 	\param position : Position du sommet inférieur gauche
     */

    Rect(float size, Vectorf position);

    Rect(float size, Vectorf aposition, Vectorf arotation);

    /*!
     * 	\fn Rect(float aWidth, float aHeight)
     * 	\brief Construit un Rectangle en 0
     *
     * 	\param aWidth  : longueur du carré
     * 	\param aHeight : largeur du carré
     */

    Rect(float awidth, float aheight);

    /*!
     * 	\fn Rect(float aWidth, float aHeight, Vector3f position)
     * 	\brief Construit un Rectangle et le translate
     *
     * 	\param aWidth  : longueur du carré
     * 	\param aHeight : largeur du carré
     */

    Rect(float aWidth, float aHeight, Vectorf aTranslation);

    ~Rect();

    /*****************************************************************/
    /*                  Méthodes                                     */
    /*****************************************************************/

    /*!
     *  \fn Display()
     *	\brief Affiche le Rectangle dans une scene OpenGL
     */

    virtual void Display();

    /*!
     * 	\fn InitBuffers();
     * 	\brief Initialise les VBO (vertex buffer objects) utilisés pour représenter le rectangle
     */

    void InitBuffers();

    /*!
     * 	\fn	RenderBuffers()
     * 	\brief	Méthode utilisé pour afficher le contenu des buffers
     */

    void RenderBuffers();

    void SetWidth(float aWidth);
    void SetHeight(float aHeight);
    void SetDimension(float aWidth, float aHeight);

    void SetColor(float x, float y, float z);
    void FillColorBuffer();
    void FillBuffer();

    virtual void Picking();
    virtual void SetPicking(unsigned char x, unsigned char y, unsigned char z);

    int RayIntersection(Vectorf * ray);

};

#endif // Rect_H
